package com.server.questionbank.snframe.service.NoteServiceImpl;

import java.util.Date;
import java.util.Map;

import jakarta.annotation.Resource;
import org.springframework.web.multipart.MultipartFile;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.server.questionbank.snframe.domain.Note.TNote;
import com.server.questionbank.snframe.domain.Note.TNoteFile;
import com.server.questionbank.snframe.mapper.Note.TNoteFileMapper;
import com.server.questionbank.snframe.mapper.Note.TNoteMapper;
import com.server.questionbank.snframe.service.NoteService.TNoteService;
import com.server.questionbank.snframe.util.Note.FileUtils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 笔记服务实现类
 * 提供笔记的增删改查、文件上传等功能
 */
@Service
@Slf4j
public class TNoteServiceImpl extends ServiceImpl<TNoteMapper, TNote> implements TNoteService {

    /** 笔记数据访问接口 */
    @Resource
    private TNoteMapper noteMapper;

    /** 笔记文件数据访问接口 */
    @Resource
    private TNoteFileMapper noteFileMapper;

    /**
     * 搜索笔记，支持分页和条件查询
     * @param page 当前页码
     * @param size 每页大小
     * @param params 查询参数，支持用户ID、课程ID、章节ID等条件
     * @return 分页后的笔记列表
     */
    @Override
    public Page<TNote> searchNotes(int page, int size, Map<String, Object> params) {
        Page<TNote> pageable = new Page<>(page, size);
        return noteMapper.selectPage(pageable, createWrapper(params));
    }
    
    /**
     * 创建新笔记
     * 自动设置创建时间和更新时间
     * @param note 笔记实体
     */
    @Override
    @Transactional
    public void createNote(TNote note) {
        note.setCreateTime(new Date());
        note.setUpdateTime(new Date());
        noteMapper.insert(note);
    }
    
    /**
     * 更新笔记信息
     * 自动更新修改时间
     * @param note 笔记实体
     */
    @Override
    @Transactional
    public void updateNote(TNote note) {
        note.setUpdateTime(new Date());
        noteMapper.updateById(note);
    }
    
    /**
     * 删除笔记及其关联的文件
     * @param noteId 笔记ID
     */
    @Override
    @Transactional
    public void deleteNote(Long noteId) {
        // 先删除笔记
        noteMapper.deleteById(noteId);
        // 再删除关联的文件记录
        noteFileMapper.delete(
            new QueryWrapper<TNoteFile>().eq("note_id", noteId)
        );
    }
    
    /**
     * 上传笔记相关文件
     * @param file 上传的文件
     * @param noteId 关联的笔记ID
     * @return 文件信息实体
     */
    @Override
    @Transactional
    public TNoteFile uploadFile(MultipartFile file, Long noteId) {
        // 调用工具类上传文件并获取存储路径
        String filePath = FileUtils.upload(file);
        
        // 创建文件记录
        TNoteFile noteFile = new TNoteFile();
        noteFile.setNoteId(noteId);
        noteFile.setFileName(file.getOriginalFilename());
        noteFile.setFilePath(filePath);
        noteFile.setFileSize(file.getSize());
        noteFile.setFileType(file.getContentType());
        noteFile.setUploadTime(new Date());
        
        // 保存文件记录
        noteFileMapper.insert(noteFile);
        return noteFile;
    }

    /**
     * 创建查询条件包装器
     * 支持多个查询条件的组合
     * @param params 查询参数
     * @return 查询条件包装器
     */
    private QueryWrapper<TNote> createWrapper(Map<String, Object> params) {
        QueryWrapper<TNote> wrapper = new QueryWrapper<>();
        
        // 根据用户ID查询
        if (params.containsKey("userId")) {
            wrapper.eq("user_id", params.get("userId"));
        }
        
//        // 根据课程ID查询
//        if (params.containsKey("courseId")) {
//            wrapper.eq("course_id", params.get("courseId"));
//        }
//
//        // 根据章节ID查询
//        if (params.containsKey("chapterId")) {
//            wrapper.eq("chapter_id", params.get("chapterId"));
//        }
//
//        // 添加知识点ID条件
//        if (params.containsKey("knowledgeId")) {
//            wrapper.eq("knowledge_id", params.get("knowledgeId"));
//        }
        
        // 添加标题模糊搜索
        if (params.containsKey("title")) {
            wrapper.like("note_title", params.get("title"));
        }
        
        // 添加内容模糊搜索
        if (params.containsKey("content")) {
            wrapper.like("note_content", params.get("content"));
        }
        
        // 添加是否公开条件
        if (params.containsKey("isPublic")) {
            wrapper.eq("is_public", params.get("isPublic"));
        }
        
        // 添加时间范围条件
        if (params.containsKey("startTime")) {
            wrapper.ge("create_time", params.get("startTime"));
        }
        if (params.containsKey("endTime")) {
            wrapper.le("create_time", params.get("endTime"));
        }
        
        // 默认按更新时间倒序排序
        wrapper.orderByDesc("update_time");
        
        return wrapper;
    }
}
